import { type Router } from 'vue-router';

// 定义与主应用通信的函数
const parentWindow = window.parent;

/**
 * 向主应用发送消息
 * @param type 消息类型
 * @param payload 消息数据
 */
function postMessageToMain(type: string, payload: any) {
  parentWindow.postMessage({ type, payload }, '*');
}

/**
 * 向主应用注册自己
 * @param appName 应用的唯一名称
 */
export function registerApp(appName: string) {
  const appUrl = window.location.origin;
  console.info(`子应用 [${appName}] 正在注册...`);
  postMessageToMain('register', { name: appName, url: appUrl });
}

/**
 * 初始化与主应用的通信，并根据指令控制路由
 * @param router vue-router 的实例
 */
export function initCommunication(router: Router) {
  window.addEventListener('message', (event) => {
    const { type, payload } = event.data;
    if (type === 'navigate') {
        console.info(`子应用收到 navigate 指令，跳转到: ${payload.path}`)
        const fromApp = payload && payload.from ? (payload.from.name || '') : ''
        const fromUrl = payload && payload.from ? (payload.from.url || '') : ''
        router.push({
          path: payload.path,
          query: { fromApp,  fromUrl}
        });
    }
  });
}

/**
 * 请求主应用跳转到另一个子应用
 * @param targetAppName 目标应用的名称
 * @param path 目标应用要跳转的路径 (可选)
 */
export function redirectTo(targetAppName: string, path?: string) {
    console.info(`请求跳转到 [${targetAppName}/${path||''}]`);
    postMessageToMain('redirect', { target: targetAppName, path });
}

/**
 * 请求主应用执行特定动作 (如全屏)
 * @param action 目标应用的执行动作名称
 * @param data 目标应用的执行动作的参数数据
 */
export function requestAction(action: string, data: string | object) {
    console.info(`请求执行动作: ${action}`);
    postMessageToMain('action', { target: 'MainApp', action, data });
  }
  
/**
 * 请求主应用存储数据
 * @param key 主应用存储的Key 
 * @param value 主应用存储的value
 */
export function saveData(key: string, value: string | object) {
    console.info(`子应用请求存储数据: key=${key}`);
    postMessageToMain('dataset', { key, value });
}
  
/**
 * 请求主应用获取数据
 * @param key 主应用存储的Key 
 * @returns 返回从主应用获取的值
 */
export function getData(key: string): Promise<string | object> {
    return new Promise((resolve, reject) => {
        // 生成一个唯一ID，用于匹配响应
        const requestId = `get-data-${Date.now()}-${Math.random()}`;
        const responseHandler = (event: MessageEvent) => {
          // 安全校验
          if (event.source !== window.parent) return;
          const { type, payload } = event.data;
          if (type === 'data-get-response' && payload.requestId === requestId) {
              // 收到响应，清理监听器，并返回数据
              window.removeEventListener('message', responseHandler);
              console.info(`子应用收到数据: key=${key}, value=`, payload.value);
              resolve(payload.value);
          }
        };

        // 监听主应用的响应
        window.addEventListener('message', responseHandler);

        // 设置超时，防止主应用没响应导致无限等待
        setTimeout(() => {
          window.removeEventListener('message', responseHandler);
          reject(new Error(`获取数据超时: ${key}`));
        }, 5000); // 5秒超时

        // 发送获取数据的请求
        console.info(`子应用请求获取数据: key=${key}`);
        postMessageToMain('dataget', { key, requestId });
    });
}